package com.hsylient.javase.chapter10;

import cn.hutool.core.date.ChineseDate;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

/*
        1.epoch(纪元)
            纪 表示时间的长河，通常指一个较长的时间段。例如，“世纪”指的是一百年的时间。
            元 示开始、起点。例如，“元年”指的是一个朝代或一个纪年的第一年。
            当“纪”和“元”组合在一起时，“纪元”表示一个时间的起点或开端，通常用来标记一个重要的历史事件或一个新的时间计算系统的开始
            Unix纪元：计算机系统中常用的纪年方式，以1970年1月1日00:00:00 UTC为起点。

 */
@Slf4j
public class DateTest {

    private static final Date NOW = new Date();


    @Test
    public void testDate() {
        log.info("[获取当前时间戳] {}", NOW.getTime());
    }

    @Test
    public void testDateAdd() {
        Duration duration = Duration.ofDays(-1);
        Instant instant = NOW.toInstant().plus(duration);
        log.info("[Date增加或者减少一天] {}", new Date(instant.toEpochMilli()));
    }



    @Test
    public void testSimpleFormat() {
        log.info("[HuTool工具类-中国农历] {}", new ChineseDate(new Date()));
        log.info("[HuTool工具类 yyyy-MM-dd格式] {}", DateUtil.today());
        log.info("[HuTool工具类 yyyy-MM-dd HH:mm:ss格式] {}", DateUtil.now());

    }


    /**
     * 用于处理时间区间
     */
    @Test
    public void testDuration() {
        Duration between = Duration.between(LocalDateTime.parse("1997-11-07T16:00:00"), LocalDateTime.now());
        log.info("出生{}秒了", between.toSeconds());

    }



    @Test
    public void testHuTool() {
        log.info("当前的时间戳是 {}", DateUtil.current()); // 13位的时间戳
//        log.info("[今天的最后一秒] {}", DateUtil.ceiling(new Date(), DateField.DAY_OF_MONTH));
//        log.info("[今天的最后一秒2] {}", DateUtil.ceiling(new Date(), DateField.DAY_OF_WEEK));
        log.info("[今天的最后一秒] {}", DateUtil.ceiling(new Date(), DateField.DAY_OF_YEAR));
//        log.info("[今天的最后一秒] {}", DateUtil.ceiling(new Date(), DateField.DAY_OF_WEEK_IN_MONTH));
    }



    @Test
    public void testTimestamp() {
        LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
        System.out.println(localDateTime);
    }

    @Test
    public void testDateFormat() {
        System.out.println(DateUtil.formatDateTime(new Date()));
    }


    @Test
    public void testDateOffset() {
        System.out.println(new Date().getTime());
        System.out.println(DateUtil.offsetMonth(new Date(), -3).getTime());
    }

}
